#!/usr/bin/env python

################################################################################
# Python Standard Library
################################################################################

################################################################################
# Includes
################################################################################

from protocols.d2 import D2Packet, D2Socket
from protocols.game import GamePacket, GameSocket
from protocols.server import ServerPacket, ServerSocket

################################################################################
# Packets
################################################################################

################################################################################
# Packet Handlers
################################################################################

class D2GSPacket(D2Packet, GamePacket, ServerPacket):
	"""
	Diablo II Game Server Packet
	"""
	
	def __init__(self):
		D2Packet.__init__(self)
		GamePacket.__init__(self)
		ServerPacket.__init__(self)
	
	def unpack(self):
		print "Unpacking D2GS packet..."
		
		self.dispatchEvent("unpack", (self,))
		
		print "D2GS packet unpacked."
	
	def pack(self):
		print "Packing D2GS packet..."
		
		sleep(0.25)
		
		self.dispatchEvent("pack", (self,))
		
		print "D2GS packet packed."
		
		return self.message

	def decompress(self):
		pass
	
	def compress(self):
		pass

################################################################################
# Socket Handlers
################################################################################

class D2GSSocket(D2Socket, GameSocket, ServerSocket):
	"""
	Diablo II Game Server Socket
	"""
	
	def __init__(self, sock = None):
		D2Socket.__init__(self, sock)
		GameSocket.__init__(self, sock)
		ServerSocket.__init__(self, sock)
		
		self.compressed = False

	def unpackPackets(self):
		i, l = 0, len(self.data)
		
		while i < l:
			if self.compressed:
				packet = D2GSPacket()
				packet.socket = self
				packet.messageSize = int(self.data[i])
				packet.messageID = self.data[i+1] #decompress this
				packet.messageLength = len(self.data)
				packet.messageData = self.data[i+1:packet.messageLength-1]
				packet.message = self.data[i:i+packet.messageLength]
			else:
				packet = D2GSPacket()
				packet.socket = self
				packet.messageID = self.data[i]
				packet.messageLength = len(self.data)
				packet.messageData = self.data[i:packet.messageLength]
				packet.message = self.data[i:i+packet.messageLength]
			
			packet.unpack()
			
			self.packets.append(packet)
			
			i += packet.messageLength
		
		self.data = ''